package com.itheima.d8_tcp5;

import java.net.ServerSocket;
import java.net.Socket;

/**
 *  目标：完成TCP通信快速入门-服务端开发：要求实现与多个客户端同时通信。
 *      BS架构是不需要开发客户端的，只需要开发服务端。是使用浏览器作为客户端的。
 *
 * 实现一个简易版的BS架构:
 *  要求从浏览器中访问服务器
 *  并立即让服务器响应一个很简单的网页给浏览器展示
 *  网页内容就是“黑马程序员666”
 *
 *浏览器不是我们开的，那我们怎么样可以在浏览器里面请求与我的服务端建立连接呢？：
 * 通过ip找到服务器主机，通过端口找到对应的服务器程序，这样就能建立一个通信管道了，平常可能是域名地址，最后会把域名地址换成IP地址和端口
 * BS架构的基本原理：
 *  http://服务器IP:服务器端口
 *  HTTP协议规定：响应给浏览器的数据格式必须满足如下格式
 * 注意：服务器必须给浏览器响应HTTP协议规定的数据格式，否则浏览器不识别返回的数据。
 * HTTP协议格式：
 * 协议版本，空格，状态码，空格，状态符，回车换行              HTTP/1.1  200 OK
 * 头部字段名 ： 值 回车换行                              Content-Type:text/html;charset=UTF-8
 *      。。。
 * 头部字段名 ： 值 回车换行
 * 回车换行                                            必须换行
 * 响应正文（真正给浏览器展示的网页数据）                   <div style="color:red;font-size:120px;text-align:center>
 *                                                          曾季洪牛逼</>
 *表示用的http协议是1.1版本，200表示响应的数据是一个正确的数据。接着说明响应的数据内容是什么格式，是一个文本内容
 *
 * 而服务端也会有主线程负责接收很多浏览器发起的连接
 *   浏览器通过网址请求与服务端建立一个socket通信管道，然后服务端就会马上分配一个单独的线程，用来负责处理这个通信管道
 *
 * 1、BS架构的基本原理是什么？
 * 客户端使用浏览器发起请求（不需要开发客户端）
 * 服务端必须按照HTTP协议响应数据。
 *
 */
public class Server {
    public static void main(String[] args) throws Exception {
        System.out.println("-----BS架构只需要服务端，服务端启动成功-------");
        // 1、创建ServerSocket的对象，同时为服务端注册端口。
        ServerSocket serverSocket = new ServerSocket(8080);

        while (true) {
            // 2、使用serverSocket对象，调用一个accept方法，等待客户端的连接请求。可以接收浏览器的socket连接
            Socket socket = serverSocket.accept();

            System.out.println("有人上线了：" + socket.getRemoteSocketAddress());

            // 3、把这个客户端对应的socket通信管道，交给一个独立的线程负责处理。接着在线程执行的时候，就可以去通信管道中为浏览器立即响应一个网页内容
            new ServerReaderThread(socket).start();
        }
    }
}













